#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>

class Util // 工具类
{
public:
    static int ReadLine(int sock, std::string& out)
    {    // 不同平台下的行分隔符可能是不一样的，可能是\r、\n或者\r\n，统一转化成\n
        char ch = 'R';
        while (ch != '\n')
        {
            ssize_t s = recv(sock, &ch, 1, 0);
            if (s > 0) // 读成功
            {
                if (ch == '\r') // 再判断后面一个字符
                {
                    recv(sock, &ch, 1, MSG_PEEK); // msg_peek窥探后面的字符，但不取走
                    if (ch == '\n') // 窥探成功，这个字符一定存在，把\r\n 转换成 \n
                    {
                        recv(sock, &ch, 1, 0); // 再往后面拿一个字符
                    }
                    else // 是其它字符，把\r 转换成 \n
                    {
                        ch = '\n';
                    }
                }
                out.push_back(ch); // 两种可能：普通字符 或 \n
            }
            else if (s == 0) // 对端关闭
            {
                return 0;
            }
            else // 出错
            {
                return -1;
            }
        }
        return out.size();
    }

    static bool CutString(const std::string& target, std::string& sub1_out, std::string& sub2_out, std::string sep)
    {   // 把target以sep为分隔符，切分成sub1_out和sub2_out两部分，
        size_t pos = target.find(sep);
        if (pos != std::string::npos)
        {
            sub1_out = target.substr(0, pos);
            sub2_out = target.substr(pos + sep.size());
            return true;
        }
        return false;
    }
};